<?php

Class RbacAction extends CommonAction {
	
	//用户列表
	Public function index () {
		//thinkphp里面有3种模型，普通模型用M来实例化
		//建个$result等于我们自定义模型全部选择出来，然后打印出来。
		//用field指定只读取主表的几个要用的字段，如果只是一个字段不要，这么用field('不要的字段名', true)
		//用relation把关联副表读取出来，如果关联关系是单表用relation(true)就行了，如果是多表就用relation('表名')
		// $result = D('UserRelation')->field('password', true)->relation(true)->select();
		// p($result);die;
		//上面已经按照多对多关联模型组合出一个数组了，下面直接分配到$this的user里面
		$this->user = D('UserRelation')->field('password', true)->relation(true)->select();
		$this->display();
	}
	//角色列表
	Public function role () {
		//先把角色全部读取出来
		// $role = M('role')->select();
		// p($role);
		//然后把它分配下去
		$this->role = M('role')->select();
		$this->display();
	}
	//节点列表
	Public function node () {
		//节点列表采用递归压入一个多维数组
		// $this->node = M('node')->order('sort')->select();
		//定义一个$field只读取有用字段，其他用不着的就不显示。
		//然后去Common文件夹下面定义一个函数。
		//注意采用分组形式，分组目录下Common文件夹内的函数文件得命名function.php
		$field = array('id', 'name', 'title', 'pid');
		$node = M('node')->field($field)->order('sort')->select();
		//调用下node_merge函数把$node传递进去赋给$node
		$this->node = node_merge($node);
		$this->display();

	}
	//添加用户
	Public function addUser () {
		$this->role = M('role')->select();
		$this->display();
	}

	//添加用户表单处理
	Public function addUserHandle () {
		//用户信息
		$user = array(
			'username' => I('username'),
			'password' => I('password', '', 'md5'),
			'logintime' => time(),
			'loginip' => get_client_ip()
			);

		//所属角色
		//$role = array();//这个好像多余
		if ($uid = M('user')->add($user)) {
			foreach ($_POST['role_id'] as $v) {
				$role[] = array(
					'role_id' => $v,
					'user_id' => $uid
					);
			}
			//添加用户角色
			M('role_user')->addAll($role);

			$this->success('添加成功', U('Admin/Rbac/index'));
		} else {
			$this->error('添加失败');
		}
	}
	//添加角色
	Public function addRole () {
		$this->display();
	}
	//添加角色表单处理
	Public function addRoleHandle () {
		//打印出提交过来的内容
		// p($_POST);
		if (M('role')->add($_POST)) {
			$this->success('添加成功', U('Admin/Rbac/role'));
		} else {
			$this->error('添加失败');
		}
	}

	//添加节点
	Public function addNode () {
		//如果GET传过来的pid为真，就取GET里面的pid的值，否则就取0；
		// $pid = isset($_GET['pid']) ? $_GET['pid'] : 0;
		//上面这个可以换成I方法来写。然后分配到$this模板上面
		$this->pid = I('pid', 0, 'intval');
		// 取GET里面的level级，没有就取1，然后intval转换一下。然后分配到$this模板上面
		$this->level = I('level', 1, 'intval');

		// p($_GET);die();
		switch ($this->level) {
			case '1':
				$this->type = '应用';
				break;
			
			case '2':
				$this->type = '控制器';
				break;
			case '3':
				$this->type = '动作方法';
				break;
		}
		$this->display();
	}

	//添加节点表单处理
	Public function addNodeHanlde () {
		// p($_POST);
		// p($_POST["name"]);
		//为了安全期间最好判断下是否POST提交，POST表单的名称不要和
		//数据库字段一样，然后自定义数组转换POST提交的内容
		// if (!IS_POST) _404('页面不存在');
		// $data = array(
		// 	'name' => $_POST["name"]
		// 	);
		// p($data);die;
		if (M('node')->add($_POST)) {
			$this->success('添加成功', U('Admin/Rbac/node'));
		} else {
			$this->error('添加失败');
		}
	}

	//配置权限
	Public function access () {
		//取得rid
		$rid = I('rid', 0, 'intval');
		//用field只读取下有用的字段
		$field = array('id', 'name', 'title', 'pid');
		//先把节点权限全部递归显示出来
		$node = M('node')->order('sort')->field($field)->select();
		//分配到$this
		// $this->node = node_merge($node);
		//要得到已有的权限，就要从数据库里面读取出来重组下再分配下去。
		//原有权限。只读取点击的这个角色role_id的权限。
		//一维数组，只读取一个字段就不用这个select方法了。
		$access = M('access')->where(array('role_id' => $rid))->getField('node_id', true);
		//把$node和$access传递过去给node_merge，然后去function.php里面把$access数据加到参数里面。
		$this->node = node_merge($node, $access);
		//把rid分配下去
		$this->rid = $rid;

		$this->display();
	}

	//修改权限
	Public function setAccess () {
		$rid = I('rid', 0, 'intval');//传递过来的。获取POST提交的rid默认为0。
		$db = M('access');
		//清空原权限。在插入新的权限之前把数据库里面对应角色ID的权限给删除了，否则总是新插入会重复。
		$db->where(array('role_id' => $rid))->delete();

		//组合新权限
		$data = array();
		//
		//循环$_POST提交的access多维数组并定义为$v
		foreach ($_POST['access'] as $v) {
			//按下划线来拆分$v
			$tmp = explode('_',$v);
			//往前面定义的这个$data数组里面压数据
			$data[] = array(
				'role_id' => $rid,
				'node_id' => $tmp[0],
				'level' => $tmp[1]
				);
		}

		//插入新权限
		if ($db->addAll($data)) {
			$this->success('修改成功', U('Admin/Rbac/role'));
		} else {
			$this->error('修改失败');
		}
	}
}
?>